package com.log;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public abstract class ServerAgentBase extends HttpServlet  {
	private static final long serialVersionUID = 1L;
	public static MyLogger log = null;	// 日志句柄
	public Properties prop = null;		// 参数管理器
	protected boolean initflag = true; 	// servlet 初始化是否成功,如不成功子类终止初始化 
											//true 为成功
	protected StringBuffer initErrMsg = new StringBuffer();

	// 获取Home路径，此路径中存放着main.conf配置文件，此函数需由派生类实现
	public abstract String getHomePath();
	
	// 获取Agent自己的ID，此函数需由派生类实现
	public abstract String getAgentID();

	// 获取程序版本
	public String getVerion() {
		return "1.00";
	}

	// 检查程序的响应时间
	public long ping() {
		return 0;
	}

	// 加载配置文件
	public Properties getConfig() {
		if (prop == null) {
			prop = new Properties();
			try {
				InputStream in;
				String path = null;
				
				// 先读取当前类目录下的"main.conf"，再根据"main.conf"中的"configPath"读取真正的配置文件
				path = getHomePath() + "main.conf";
				MyLogger.getGlobal().debug("ServerAgentBase::getConfig() load common config from : " + path);
				in = new FileInputStream(getHomePath() + "main.conf");
				prop.load(in);
				in.close();

				// 根据"main.conf"中的"configPath"读取真正的配置文件
				path = prop.getProperty("configPath") + getAgentID() + ".conf";
				MyLogger.getGlobal().debug("ServerAgentBase::getConfig() load application config from : " + path);
				in = new FileInputStream(path);				
				prop.load(in);	// 加载配置文件内容
				in.close();
			} catch (FileNotFoundException e) {
				// 注意：此处日志还未初始化，所以使用全局日志！
				MyLogger.getGlobal().error(e.getMessage());
				prop = null;
			} catch (IOException e) {
				// 注意：此处日志还未初始化，所以使用全局日志！
				MyLogger.getGlobal().error(e.getMessage());
				prop = null;
			}
		}
		return prop;
	}

	// 获取日志
	public MyLogger getLogger() {
		if (log == null) {
			// 获得日志参数
			Properties prop = getConfig();
			
			// 从配置文件中读日志文件路径
			String path = prop.getProperty("log.path", "main.log");
			//String path = getHomePath() + "main.log"; // 直接将日志放在当前类目录下
			
			// 读取日志级别
			int level = Integer.parseInt(prop.getProperty("log.level", "0"));
			//读取绕接文件大小
			int length = Integer.parseInt(prop.getProperty("log.length", "5"));
			// 创建日志
			log = MyLogger.getGlobal();
			log.setLogPath(path, level ,length);
			// 注意：使用全局日志！
			MyLogger.getGlobal().debug("ServerAgentBase(" + getAgentID() + ") log file created in : " + path);
			
			// 将此日志设为全局的
			//log.setAsGlobal();
		}
		return log;
	}

	// Servlet初始化
	public void init(ServletConfig config) throws ServletException {
		try {
			super.init(config);
			// 注意：此处日志还未初始化，所以使用全局日志！
			MyLogger.getGlobal().debug("ServerAgentBase(" + getAgentID() + ")::init begin ...");
			// 初始化配置文件
			getConfig();
			// 初始化日志
			getLogger();
			// 注意：使用全局日志！
			MyLogger.getGlobal().debug("ServerAgentBase(" + getAgentID() + ")::init end.");
		} catch (Exception e) {
			MyLogger.getGlobal().fatal("ServerAgentBase(" + getAgentID() + ")::init failed !");
			MyLogger.getGlobal().fatal(e.getMessage());
			initflag = false;
		}
	}
	public void destroy() {
		log.info("ServerAgentBase destroy");
		super.destroy();
		System.out.println("ServerAgentBase destroy end!");
	}
}
